package vista;

import java.util.Iterator;
import java.util.List;

import modelo.Barco;
import modelo.Direccion;
import modelo.Posicion;
import fiuba.algo3.titiritero.modelo.ObjetoPosicionable;
import fiuba.algo3.titiritero.modelo.ObjetoVivo;

public class BarcoPosicionable implements ObjetoPosicionable, ObjetoVivo {
	private Barco barco;
	Direccion direccion;
	Posicion posicionDeDibujo;
	private int x;
	private int y;
	
	public BarcoPosicionable(Barco unBarco){
		barco = unBarco;
		posicionDeDibujo = posicionDeLaEsquinaSuperiorIzquierda();
		direccion = barco.getDireccion();
		x = posicionDeDibujo.getColumna()*50;
		y = posicionDeDibujo.getFila()*50;
	}
	
	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}
	
	private Posicion posicionDeLaEsquinaSuperiorIzquierda() {		
		List<Posicion> posiciones = barco.getPosiciones();
		Iterator<Posicion> iteradorDePosiciones = posiciones.iterator();
		
		Posicion posicionDeLaEsquina = iteradorDePosiciones.next();
		int columnaMinima = posicionDeLaEsquina.getColumna();
		int filaMinima = posicionDeLaEsquina.getFila();
      	while (iteradorDePosiciones.hasNext()) {
      		Posicion posicion = iteradorDePosiciones.next();
      		if (posicion.getColumna() < columnaMinima) {
      			posicionDeLaEsquina = posicion;
      			columnaMinima = posicionDeLaEsquina.getColumna();
      		}
      		if (posicion.getFila() < filaMinima) {
      			posicionDeLaEsquina = posicion;
      			filaMinima = posicionDeLaEsquina.getFila();
      		}
      	}
      	
		return posicionDeLaEsquina;		
	}

	public boolean estaVertical() {				
		List<Posicion> posiciones = barco.getPosiciones();
		int columnaInicial = (posiciones.get(0)).getColumna();
		int columnaFinal = (posiciones.get(posiciones.size()-1)).getColumna();
		
		if (columnaInicial == columnaFinal){
			return true;
		}
		return false;
	}

	@Override
	public void vivir() {
		x = x + direccion.getFactorDeAumentoDeColumna();
		y = y + direccion.getFactorDeAumentoDeFila();
		if (sePasoDelBorde()) {
			x = x - direccion.getFactorDeAumentoDeColumna();
			y = y - direccion.getFactorDeAumentoDeFila();
			direccion = direccion.getDireccionOpuesta();
			x = x + direccion.getFactorDeAumentoDeColumna();
			y = y + direccion.getFactorDeAumentoDeFila();
			
		}
		if (posicionDeDibujo != posicionDeLaEsquinaSuperiorIzquierda()) {
			posicionDeDibujo = posicionDeLaEsquinaSuperiorIzquierda();
			direccion = barco.getDireccion();
			x = posicionDeDibujo.getColumna()*50;
			y = posicionDeDibujo.getFila()*50;
		}		
	}

	private boolean sePasoDelBorde() {
		boolean sePaso = false;
		if (x < 0 || y < 0) {
			sePaso = true;
		}

		List<Posicion> posiciones = barco.getPosiciones();
		int ancho = 50;
		int largo = 50;
        int columnaInicial = (posiciones.get(0)).getColumna();
        int columnaFinal = (posiciones.get(posiciones.size()-1)).getColumna();
        
        if (columnaInicial == columnaFinal){
                largo = 50*(posiciones.size());
        }
        else {
                ancho = 50*(posiciones.size());
        }
        
		int xFinal = x + ancho;
		int yFinal = y + largo;
		
		if (xFinal > 500 || yFinal > 500) {
			sePaso = true;
		}
		return sePaso;
	}
}
